RDLC .Net 4 Local Mode Performans Sorunu

Sıkıntıya sebep olan kısmı açıklayacak olursak; bir rapor, .net 4 ile ReporViewer mevcut AppDomain yerine Sandbox AppDomain yapısı içerisinde işletilmektedir. Bu yenilik ile birlikte “Expression Evaluation” ifadeleri “Local Mode” mod ile çalıştırıldığında performans sorunu ortaya çıkmaktadır. Bu soruna çözüm olarak

  1. Web.config <system.web> tag içerisine <trust legacyCasModel="true" level="Full"/> ifadesini eklemek suretiyle CAS Security yapısı sınırsız izin hakkı ile aktif hale getirilir. Bu değişik şöyle bir sıkıntıya sebep olabilir uygulama üzerinde “dynamic” tanımlanmış bir değişken var ise uygulama runtime da hata verir.

  2. Uygulama .net 3.5 downgrade edilir. Bu yönetimi uyguladığınızda .net 4 ile gelen yenilikleri kullanma imkanınız ortadan kalkar.

  3. Raporlarınız yeni oluşturacağınız AppDomain içerisinde üretilir.

a. Mevcut App Domain ayarları alınır

AppDomainSetup currentSetup = AppDomain.CurrentDomain.SetupInformation;
AppDomainSetup ads = new AppDomainSetup
 {
   ApplicationBase = currentSetup.ApplicationBase,
   LoaderOptimization = LoaderOptimization.MultiDomainHost,
   PrivateBinPath = currentSetup.PrivateBinPath,
   PrivateBinPathProbe = currentSetup.PrivateBinPathProbe,
 };

b. CAS security yapısı aktif edilir.

ads.SetCompatibilitySwitches(new[] { "NetFx40_LegacySecurityPolicy" });

c. Yeni AppDomain oluşturulur

AppDomain appDomain = AppDomain.CreateDomain("Full Trust", null,FullTrustedAppDomainSetup);

d. Yeni AppDomain de raporun üretileceği MarshalByRefObject nesnesi üretilir.

 
ReportHelperInAppDomain repHelper = (ReportHelperInAppDomain) appDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);

e. Üretilen AppDomain ve MarshalByRefObject nesnesinde rapor render edilir.

byte [] data = repHelper.RenderReport(reportName, reportDataSource.Name, dataTableToXmlStr, dataTable.TableName, dicParameters, format, deviceInfo);